import pandas as pd
import numpy as np

def demonstrate_dataframe_assignment():
    """
    演示Pandas DataFrame的各种赋值语法
    """
    print("=== Pandas DataFrame赋值操作演示 ===\n")
    
    # 1. 创建示例DataFrame
    print("1. 创建示例DataFrame:")
    data = {
        '姓名': ['张三', '李四', '王五', '赵六'],
        '年龄': [25, 30, 35, 28],
        '城市': ['北京', '上海', '广州', '深圳'],
        '薪资': [15000, 20000, 18000, 22000]
    }
    df = pd.DataFrame(data)
    print(df)
    print()
    
    # 2. 整列赋值操作
    print("2. 整列赋值操作:")
    
    # 2.1 直接赋值（创建新列）
    df['奖金'] = [2000, 3000, 2500, 3500]
    print("2.1 添加新列'奖金':")
    print(df[['姓名', '奖金']])
    print()
    
    # 2.2 使用标量值赋值整列
    df['部门'] = '技术部'
    print("2.2 使用标量值赋值整列:")
    print(df[['姓名', '部门']])
    print()
    
    # 2.3 基于现有列计算赋值
    df['总薪资'] = df['薪资'] + df['奖金']
    print("2.3 基于现有列计算赋值:")
    print(df[['姓名', '薪资', '奖金', '总薪资']])
    print()
    
    # 2.4 使用assign方法（不修改原DataFrame）
    df_new = df.assign(绩效系数=[1.2, 1.5, 1.3, 1.4])
    print("2.4 使用assign方法创建新DataFrame:")
    print(df_new[['姓名', '绩效系数']])
    print("原DataFrame保持不变，未包含绩效系数列")
    print()
    
    # 3. 单个单元格赋值
    print("3. 单个单元格赋值:")
    
    # 3.1 使用at（基于标签）
    df.at[0, '年龄'] = 26
    print("3.1 使用at修改单个单元格（张三年龄改为26）:")
    print(f"修改结果: 张三的年龄现在是 {df.at[0, '年龄']}")
    print()
    
    # 3.2 使用iat（基于整数位置）
    df.iat[1, 1] = 31  # 第二行，第二列（李四的年龄）
    print("3.2 使用iat修改单个单元格（李四年龄改为31）:")
    print(f"修改结果: 李四的年龄现在是 {df.iat[1, 1]}")
    print()
    
    # 4. 使用loc进行赋值
    print("4. 使用loc进行赋值:")
    
    # 4.1 修改单个单元格
    df.loc[2, '城市'] = '杭州'
    print("4.1 使用loc修改单个单元格（王五城市改为杭州）:")
    print(df.loc[2:2, ['姓名', '城市']])
    print()
    
    # 4.2 修改整行
    df.loc[3] = ['赵六', 29, '成都', 23000, 4000, 27000, '技术部']
    print("4.2 使用loc修改整行数据（赵六信息更新）:")
    print(df.loc[3:3])
    print()
    
    # 4.3 条件赋值
    df.loc[df['年龄'] > 30, '等级'] = '资深'
    df.loc[df['年龄'] <= 30, '等级'] = '普通'
    print("4.3 使用loc进行条件赋值:")
    print(df[['姓名', '年龄', '等级']])
    print()
    
    # 5. 使用iloc进行赋值（基于位置索引）
    print("5. 使用iloc进行赋值:")
    
    # 5.1 修改单个单元格
    df.iloc[0, 3] = 16000  # 第一行，第四列（张三的薪资）
    print("5.1 使用iloc修改单个单元格（张三薪资改为16000）:")
    print(f"修改结果: 张三的薪资现在是 {df.iloc[0, 3]}")
    print()
    
    # 5.2 修改整行
    df.iloc[1] = ['李四', 32, '上海', 21000, 3200, 24200, '技术部', '资深']
    print("5.2 使用iloc修改整行数据（李四信息更新）:")
    print(df.iloc[1:2])
    print()
    
    # 6. 使用条件进行批量赋值
    print("6. 条件批量赋值:")
    
    # 给薪资超过20000的员工增加特殊奖金
    df.loc[df['薪资'] > 20000, '特殊奖金'] = 5000
    df['特殊奖金'] = df['特殊奖金'].fillna(0)
    print("6.1 薪资超过20000的员工获得特殊奖金:")
    print(df[['姓名', '薪资', '特殊奖金']])
    print()
    
    # 7. 使用replace方法替换值
    print("7. 使用replace方法替换值:")
    
    # 替换特定值
    df_replaced = df.replace({'技术部': '研发部'})
    print("7.1 将'技术部'替换为'研发部':")
    print(df_replaced[['姓名', '部门']].head())
    print()
    
    # 8. 使用where进行条件赋值
    print("8. 使用where进行条件赋值:")
    
    # 只保留满足条件的值，不满足条件的替换为NaN或其他值
    df['调整后薪资'] = df['薪资'].where(df['薪资'] > 18000, 18000)
    print("8.1 薪资低于18000的调整为18000:")
    print(df[['姓名', '薪资', '调整后薪资']])
    print()
    
    # 9. 处理缺失值赋值
    print("9. 缺失值处理赋值:")
    
    # 创建有缺失值的示例
    df_nan = pd.DataFrame({
        'A': [1, 2, np.nan, 4],
        'B': [5, np.nan, 7, 8],
        'C': [9, 10, 11, 12]
    })
    
    print("9.1 原始数据（包含缺失值）:")
    print(df_nan)
    print()
    
    # 填充缺失值
    df_filled = df_nan.fillna({'A': 0, 'B': 999})
    print("9.2 填充缺失值后:")
    print(df_filled)
    print()
    
    # 10. 最终数据展示
    print("10. 最终完整的DataFrame:")
    print(df)
    print()
    
    print("=== 赋值操作演示完成 ===")
    
    return df

if __name__ == "__main__":
    # 执行演示函数
    result_df = demonstrate_dataframe_assignment()
    
    
    # 可选：将结果保存到CSV文件
    # result_df.to_csv('dataframe_assignment_demo.csv', index=False, encoding='utf-8-sig')
    # print("结果已保存到 dataframe_assignment_demo.csv")